package com.xuan.utils.xuan.bazi;

import lombok.Data;

import java.util.Calendar;
import java.util.Date;

/**
 * 八字-基础设置
 *
 * @author 善待
 */
@Data
public class BaZiSetting {

    /**
     * 是否为示例数据（true:是。false:否）
     */
    private Boolean isShiLi;

    /**
     * 姓名
     */
    private String name;

    /**
     * 占事
     */
    private String occupy;

    /**
     * 性别（0:女。1:男）
     */
    private int sex;

    /**
     * 地区
     */
    private String address;

    /**
     * 日期
     */
    private Date date;

    /**
     * 日期类型（0:公历。1:农历）
     */
    private int dateType;

    /**
     * 是否使用闰月（true:使用闰月。false:不使用闰月）
     */
    private Boolean isLeapMonth;

    /**
     * 起运流派（0:按天数和时辰数计算：3天1年、1天4个月、1时辰10天。1:按分钟数计算：4320分=1年、360分=1月、12分=1天、1分=2小时）
     */
    private int qiYunLiuPai;

    /**
     * 年干支排法（0:以正月初一作为新年的开始。1:以立春当天作为新年的开始。2:以立春交接的时刻作为新年的开始）
     */
    private int yearGanZhiSet;

    /**
     * 月干支排法（0:以节交接当天起算。1:以节交接时刻起算）
     */
    private int monthGanZhiSet;

    /**
     * 日干支排法（0:晚子时日柱按当天。1:晚子时日柱按明天）
     */
    private int dayGanZhiSet;

    /**
     * 时干支排法（0:支持早子时和晚子时）
     */
    private int hourGanZhiSet;

    /**
     * 人元司令分野类型（0:子平真诠法决。1:渊海子平法决。2:星平会海法决。3:三命通会法决。4:神峰通考法决。5:万育吾之法决）
     */
    private int renYuanType;

    /**
     * 大运轮数设置
     */
    private int daYunLunSet;

    /**
     * 正格取法（0:以月令主气直接取格。1:以月令透干取格）
     */
    private int zhengGeQuFa;


    /**
     * 天干相生显示设置（true:显示。false:关闭）
     */
    private Boolean tianGanXiangShengSet;

    /**
     * 天干相克显示设置（true:显示。false:关闭）
     */
    private Boolean tianGanXiangKeSet;

    /**
     * 天干相合显示设置（true:显示。false:关闭）
     */
    private Boolean tianGanXiangHeSet;

    /**
     * 天干相冲显示设置（true:显示。false:关闭）
     */
    private Boolean tianGanXiangChongSet;


    /**
     * 地支半合显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiBanHeSet;

    /**
     * 地支拱合显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiGongHeSet;

    /**
     * 地支暗合显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiAnHeSet;

    /**
     * 地支三合显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiSanHeSet;

    /**
     * 地支六合显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiLiuHeSet;

    /**
     * 地支相刑显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiXiangXingSet;

    /**
     * 地支三刑显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiSanXingSet;

    /**
     * 地支相冲显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiXiangChongSet;

    /**
     * 地支相破显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiXiangPoSet;

    /**
     * 地支相害显示设置（true:显示。false:关闭）
     */
    private Boolean diZhiXiangHaiSet;


    /**
     * 太极贵人显示设置（true:显示。false:关闭）
     */
    private Boolean taiJiGuiRenSet;

    /**
     * 天乙贵人显示设置（true:显示。false:关闭）
     */
    private Boolean tianYiGuiRenSet;

    /**
     * 福星贵人显示设置（true:显示。false:关闭）
     */
    private Boolean fuXingGuiRenSet;

    /**
     * 文昌贵人显示设置（true:显示。false:关闭）
     */
    private Boolean wenChangGuiRenSet;

    /**
     * 天厨贵人显示设置（true:显示。false:关闭）
     */
    private Boolean tianChuGuiRenSet;

    /**
     * 月德贵人显示设置（true:显示。false:关闭）
     */
    private Boolean yueDeGuiRenSet;

    /**
     * 德秀贵人显示设置（true:显示。false:关闭）
     */
    private Boolean deXiuGuiRenSet;

    /**
     * 天德贵人显示设置（true:显示。false:关闭）
     */
    private Boolean tianDeGuiRenSet;

    /**
     * 十恶大败显示设置（true:显示。false:关闭）
     */
    private Boolean shiEDaBaiSet;

    /**
     * 阴差阳错显示设置（true:显示。false:关闭）
     */
    private Boolean yinChaYangCuoSet;

    /**
     * 四废日显示设置（true:显示。false:关闭）
     */
    private Boolean siFeiRiSet;

    /**
     * 六秀日显示设置（true:显示。false:关闭）
     */
    private Boolean liuXiuRiSet;

    /**
     * 十灵日显示设置（true:显示。false:关闭）
     */
    private Boolean shiLingRiSet;

    /**
     * 魁罡日显示设置（true:显示。false:关闭）
     */
    private Boolean kuiGangRiSet;

    /**
     * 八专日显示设置（true:显示。false:关闭）
     */
    private Boolean baZhuanRiSet;

    /**
     * 九丑日显示设置（true:显示。false:关闭）
     */
    private Boolean jiuChouRiSet;

    /**
     * 孤鸾煞显示设置（true:显示。false:关闭）
     */
    private Boolean guLuanShaSet;

    /**
     * 红艳煞显示设置（true:显示。false:关闭）
     */
    private Boolean hongYanShaSet;

    /**
     * 勾绞煞显示设置（true:显示。false:关闭）
     */
    private Boolean gouJiaoShaSet;

    /**
     * 童子煞显示设置（true:显示。false:关闭）
     */
    private Boolean tongZiShaSet;

    /**
     * 华盖显示设置（true:显示。false:关闭）
     */
    private Boolean huaGaiSet;

    /**
     * 国印显示设置（true:显示。false:关闭）
     */
    private Boolean guoYinSet;

    /**
     * 金舆显示设置（true:显示。false:关闭）
     */
    private Boolean jinYuSet;

    /**
     * 羊刃显示设置（true:显示。false:关闭）
     */
    private Boolean yangRenSet;

    /**
     * 飞刃显示设置（true:显示。false:关闭）
     */
    private Boolean feiRenSet;

    /**
     * 流霞显示设置（true:显示。false:关闭）
     */
    private Boolean liuXiaSet;

    /**
     * 禄神显示设置（true:显示。false:关闭）
     */
    private Boolean luShenSet;

    /**
     * 驿马显示设置（true:显示。false:关闭）
     */
    private Boolean yiMaSet;

    /**
     * 劫煞显示设置（true:显示。false:关闭）
     */
    private Boolean jieShaSet;

    /**
     * 将星显示设置（true:显示。false:关闭）
     */
    private Boolean jiangXingSet;

    /**
     * 桃花显示设置（true:显示。false:关闭）
     */
    private Boolean taoHuaSet;

    /**
     * 亡神显示设置（true:显示。false:关闭）
     */
    private Boolean wangShenSet;

    /**
     * 吊客显示设置（true:显示。false:关闭）
     */
    private Boolean diaoKeSet;

    /**
     * 披麻显示设置（true:显示。false:关闭）
     */
    private Boolean piMaSet;

    /**
     * 天喜显示设置（true:显示。false:关闭）
     */
    private Boolean tianXiSet;

    /**
     * 红鸾显示设置（true:显示。false:关闭）
     */
    private Boolean hongLuanSet;

    /**
     * 丧门显示设置（true:显示。false:关闭）
     */
    private Boolean sangMenSet;

    /**
     * 灾煞显示设置（true:显示。false:关闭）
     */
    private Boolean zaiShaSet;

    /**
     * 孤辰显示设置（true:显示。false:关闭）
     */
    private Boolean guChenSet;

    /**
     * 寡宿显示设置（true:显示。false:关闭）
     */
    private Boolean suGuaSet;

    /**
     * 元辰显示设置（true:显示。false:关闭）
     */
    private Boolean yuanChenSet;

    /**
     * 血刃显示设置（true:显示。false:关闭）
     */
    private Boolean xueRenSet;

    /**
     * 天医显示设置（true:显示。false:关闭）
     */
    private Boolean tianYiSet;

    /**
     * 词馆显示设置（true:显示。false:关闭）
     */
    private Boolean ciGuanSet;

    /**
     * 学堂显示设置（true:显示。false:关闭）
     */
    private Boolean xueTangSet;

    /**
     * 天赦显示设置（true:显示。false:关闭）
     */
    private Boolean tianSheSet;

    /**
     * 天转显示设置（true:显示。false:关闭）
     */
    private Boolean tianZhuanSet;

    /**
     * 地转显示设置（true:显示。false:关闭）
     */
    private Boolean diZhuanSet;

    /**
     * 拱禄显示设置（true:显示。false:关闭）
     */
    private Boolean gongLuSet;

//****************************************************************************************************************************************************

    /**
     * 初始化设置
     */
    public BaZiSetting() {

        initialize(); // 设置默认初始化数据

    }

    /**
     * 使用公历日期初始化
     *
     * @param date 公历日期
     */
    public BaZiSetting(Date date) {

        initialize(); // 设置默认初始化数据

        this.date = date; // 日期

    }

    /**
     * 使用日期、日期类型初始化
     *
     * @param date     日期
     * @param dateType 日期类型（0:公历。1:农历）
     */
    public BaZiSetting(Date date, int dateType) {

        initialize(); // 设置默认初始化数据

        this.date = date; // 日期
        this.dateType = dateType; // 日期类型（0:公历。1:农历）

    }

    /**
     * 使用公历年月日时分秒初始化
     *
     * @param year   公历年（0~9999）
     * @param month  公历月（1~12）
     * @param day    公历日（1~31）
     * @param hour   公历时（0~23）
     * @param minute 公历分（0~59）
     * @param second 公历秒（0~59）
     */
    public BaZiSetting(int year, int month, int day, int hour, int minute, int second) {

        initialize(); // 设置默认初始化数据

        Calendar c = Calendar.getInstance();
        c.set(year, month - 1, day, hour, minute, second);
        this.date = c.getTime();

    }

    /**
     * 使用年月日时分秒、日期类型初始化
     *
     * @param year     年
     * @param month    月
     * @param day      日
     * @param hour     时
     * @param minute   分
     * @param second   秒
     * @param dateType 日期类型（0:公历。1:农历）
     */
    public BaZiSetting(int year, int month, int day, int hour, int minute, int second, int dateType) {

        initialize(); // 设置默认初始化数据

        Calendar c = Calendar.getInstance();
        c.set(year, month - 1, day, hour, minute, second);
        this.date = c.getTime();

        this.dateType = dateType; // 日期类型（0:公历。1:农历）

    }

    /**
     * 设置默认初始化数据
     */
    private void initialize() {

        this.isShiLi = false; // 是否为示例数据（默认→ 否）
        this.name = ""; // 姓名（默认→ 空）
        this.occupy = ""; // 占事（默认→ 空）
        this.sex = 1; // 性别（默认→ 男）
        this.address = ""; // 地区（默认→ 空）
        this.date = new Date(); // 日期（默认→ 当前日期）
        this.dateType = 0; // 日期类型（默认→ 公历）
        this.isLeapMonth = false; // 是否使用闰月（默认→ 不使用闰月）
        this.qiYunLiuPai = 1; // 起运流派（默认→ 按分钟数计算：4320分=1年、360分=1月、12分=1天、1分=2小时）
        this.yearGanZhiSet = 1; // 年干支排法（默认→ 以立春当天作为新年的开始）
        this.monthGanZhiSet = 1; // 月干支排法（默认→ 以节交接时刻起算）
        this.dayGanZhiSet = 0; // 日干支排法，同子时流派（默认→ 晚子时日干支按当天）
        this.hourGanZhiSet = 0; // 时干支排法（默认→ 支持早子时和晚子时）
        this.renYuanType = 0; // 人元司令分野类型（默认→ 子平真诠法决）
        this.daYunLunSet = 10; // 大运轮数设置（默认→ 10轮）
        this.zhengGeQuFa = 0; // 正格取法（默认→ 以月令主气直接取格）

        this.tianGanXiangShengSet = true; // 天干相生显示设置（默认→ 显示）
        this.tianGanXiangKeSet = true; // 天干相克显示设置（默认→ 显示）
        this.tianGanXiangHeSet = true; // 天干相合显示设置（默认→ 显示）
        this.tianGanXiangChongSet = true; // 天干相冲显示设置（默认→ 显示）
        this.diZhiBanHeSet = true; // 地支半合显示设置（默认→ 显示）
        this.diZhiGongHeSet = true; // 地支拱合显示设置（默认→ 显示）
        this.diZhiAnHeSet = true; // 地支暗合显示设置（默认→ 显示）
        this.diZhiSanHeSet = true; // 地支三合显示设置（默认→ 显示）
        this.diZhiLiuHeSet = true; // 地支六合显示设置（默认→ 显示）
        this.diZhiXiangXingSet = true; // 地支相刑显示设置（默认→ 显示）
        this.diZhiSanXingSet = true; // 地支三刑显示设置（默认→ 显示）
        this.diZhiXiangChongSet = true; // 地支相冲显示设置（默认→ 显示）
        this.diZhiXiangPoSet = true; // 地支相破显示设置（默认→ 显示）
        this.diZhiXiangHaiSet = true; // 地支相害显示设置（默认→ 显示）
        this.taiJiGuiRenSet = true; // 太极贵人显示设置（默认→ 显示）
        this.tianYiGuiRenSet = true; // 天乙贵人显示设置（默认→ 显示）
        this.fuXingGuiRenSet = true; // 福星贵人显示设置（默认→ 显示）
        this.wenChangGuiRenSet = true; // 文昌贵人显示设置（默认→ 显示）
        this.tianChuGuiRenSet = true; // 天厨贵人显示设置（默认→ 显示）
        this.yueDeGuiRenSet = true; // 月德贵人显示设置（默认→ 显示）
        this.deXiuGuiRenSet = true; // 德秀贵人显示设置（默认→ 显示）
        this.tianDeGuiRenSet = true; // 天德贵人显示设置（默认→ 显示）
        this.shiEDaBaiSet = true; // 十恶大败显示设置（默认→ 显示）
        this.yinChaYangCuoSet = true; // 阴差阳错显示设置（默认→ 显示）
        this.siFeiRiSet = true; // 四废日显示设置（默认→ 显示）
        this.liuXiuRiSet = true; // 六秀日显示设置（默认→ 显示）
        this.shiLingRiSet = true; // 十灵日显示设置（默认→ 显示）
        this.kuiGangRiSet = true; // 魁罡日显示设置（默认→ 显示）
        this.baZhuanRiSet = true; // 八专日显示设置（默认→ 显示）
        this.jiuChouRiSet = true; // 九丑日显示设置（默认→ 显示）
        this.guLuanShaSet = true; // 孤鸾煞显示设置（默认→ 显示）
        this.hongYanShaSet = true; // 红艳煞显示设置（默认→ 显示）
        this.gouJiaoShaSet = true; // 勾绞煞显示设置（默认→ 显示）
        this.tongZiShaSet = true; // 童子煞显示设置（默认→ 显示）
        this.huaGaiSet = true; // 华盖显示设置（默认→ 显示）
        this.guoYinSet = true; // 国印显示设置（默认→ 显示）
        this.jinYuSet = true; // 金舆显示设置（默认→ 显示）
        this.yangRenSet = true; // 羊刃显示设置（默认→ 显示）
        this.feiRenSet = true; // 飞刃显示设置（默认→ 显示）
        this.liuXiaSet = true; // 流霞显示设置（默认→ 显示）
        this.luShenSet = true; // 禄神显示设置（默认→ 显示）
        this.yiMaSet = true; // 驿马显示设置（默认→ 显示）
        this.jieShaSet = true; // 劫煞显示设置（默认→ 显示）
        this.jiangXingSet = true; // 将星显示设置（默认→ 显示）
        this.taoHuaSet = true; // 桃花显示设置（默认→ 显示）
        this.wangShenSet = true; // 亡神显示设置（默认→ 显示）
        this.diaoKeSet = true; // 吊客显示设置（默认→ 显示）
        this.piMaSet = true; // 披麻显示设置（默认→ 显示）
        this.tianXiSet = true; // 天喜显示设置（默认→ 显示）
        this.hongLuanSet = true; // 红鸾显示设置（默认→ 显示）
        this.sangMenSet = true; // 丧门显示设置（默认→ 显示）
        this.zaiShaSet = true; // 灾煞显示设置（默认→ 显示）
        this.guChenSet = true; // 孤辰显示设置（默认→ 显示）
        this.suGuaSet = true; // 寡宿显示设置（默认→ 显示）
        this.yuanChenSet = true; // 元辰显示设置（默认→ 显示）
        this.xueRenSet = true; // 血刃显示设置（默认→ 显示）
        this.tianYiSet = true; // 天医显示设置（默认→ 显示）
        this.ciGuanSet = true; // 词馆显示设置（默认→ 显示）
        this.xueTangSet = true; // 学堂显示设置（默认→ 显示）
        this.tianSheSet = true; // 天赦显示设置（默认→ 显示）
        this.tianZhuanSet = true; // 天转显示设置（默认→ 显示）
        this.diZhuanSet = true; // 地转显示设置（默认→ 显示）
        this.gongLuSet = true; // 拱禄显示设置（默认→ 显示）

    }

//----------------------------------------------------------------------------------------------------------------------------------------------------

    /**
     * 是否为示例数据
     *
     * @param isShiLi 是否为示例数据（true:是。false:否）
     */
    public void setIsShiLi(Boolean isShiLi) {
        this.isShiLi = isShiLi;
    }

    /**
     * 性别
     *
     * @param sex 性别（0:女。1:男）
     */
    public void setSex(int sex) {
        boolean boo = (sex == 0 || sex == 1);
        this.sex = boo ? sex : 1;
    }

    /**
     * 日期
     *
     * @param date 日期
     */
    public void setDate(Date date) {
        this.date = (null == date ? new Date() : date);
    }

    /**
     * 日期类型
     *
     * @param dateType 日期类型（0:公历。1:农历）
     */
    public void setDateType(int dateType) {
        boolean boo = (dateType == 0 || dateType == 1);
        this.dateType = boo ? dateType : 0;
    }

    /**
     * 是否使用闰月
     *
     * @param isLeapMonth 是否使用闰月（true:使用闰月。false:不使用闰月）
     */
    public void setLeapMonth(Boolean isLeapMonth) {
        this.isLeapMonth = isLeapMonth;
    }

    /**
     * 起运流派
     *
     * @param qiYunLiuPai 起运流派（0:按天数和时辰数计算：3天1年、1天4个月、1时辰10天。1:按分钟数计算：4320分=1年、360分=1月、12分=1天、1分=2小时）
     */
    public void setQiYunLiuPai(int qiYunLiuPai) {
        boolean boo = (qiYunLiuPai == 0 || qiYunLiuPai == 1);
        this.qiYunLiuPai = boo ? qiYunLiuPai : 1;
    }

    /**
     * 年干支设置
     *
     * @param yearGanZhiSet 年干支排法（0:以正月初一作为新年的开始。1:以立春当天作为新年的开始。2:以立春交接的时刻作为新年的开始）
     */
    public void setYearGanZhiSet(int yearGanZhiSet) {
        boolean boo = (yearGanZhiSet == 0 || yearGanZhiSet == 1 || yearGanZhiSet == 2);
        this.yearGanZhiSet = boo ? yearGanZhiSet : 1;
    }

    /**
     * 月干支设置
     *
     * @param monthGanZhiSet 月干支排法（0:以节交接当天起算。1:以节交接时刻起算）
     */
    public void setMonthGanZhiSet(int monthGanZhiSet) {
        boolean boo = (monthGanZhiSet == 0 || monthGanZhiSet == 1);
        this.monthGanZhiSet = boo ? monthGanZhiSet : 1;
    }

    /**
     * 日干支设置
     *
     * @param dayGanZhiSet 日干支排法（0:晚子时日干支按当天。1:晚子时日干支按明天）
     */
    public void setDayGanZhiSet(int dayGanZhiSet) {
        boolean boo = (dayGanZhiSet == 0 || dayGanZhiSet == 1);
        this.dayGanZhiSet = boo ? dayGanZhiSet : 0;
    }

    /**
     * 人元司令分野类型
     *
     * @param renYuanType 人元司令分野类型（0:子平真诠法决。1:渊海子平法决。2:星平会海法决。3:三命通会法决。4:神峰通考法决。5:万育吾之法决）
     */
    public void setRenYuanType(int renYuanType) {
        boolean boo = (renYuanType == 0 || renYuanType == 1 || renYuanType == 2 || renYuanType == 3 || renYuanType == 4 || renYuanType == 5);
        this.renYuanType = boo ? renYuanType : 0;
    }

    /**
     * 大运轮数设置
     *
     * @param daYunLunSet 大运轮数设置
     */
    public void setDaYunLunSet(int daYunLunSet) {
        if (daYunLunSet < 10) {
            this.daYunLunSet = 10;
        } else if (daYunLunSet > 16) {
            this.daYunLunSet = 16;
        } else {
            this.daYunLunSet = daYunLunSet;
        }
    }

    /**
     * 正格取法
     *
     * @param zhengGeQuFa 正格取法（0:以月令主气直接取格。1:以月令透干取格）
     */
    public void setZhengGeQuFa(int zhengGeQuFa) {
        boolean boo = (zhengGeQuFa == 0 || zhengGeQuFa == 1);
        this.zhengGeQuFa = boo ? zhengGeQuFa : 0;
    }


}
